//
//  BaseTableVC.swift
//  TableVC
//
//  Created by mini on 2025/4/28.
//

import Foundation

class BaseTableVC: BaseVC, UITableViewDelegate, UITableViewDataSource, UIScrollViewDelegate {

    var isRemoveAll: Bool = true // 是否移除全部
    var isPopNextPage: Bool = false // true 就是普通的返回上一页

    // MARK: - lazy
    lazy var aryDatas: NSMutableArray = {
        let array = NSMutableArray()
        return array
    }()

    lazy var strCellName: String? = nil

    lazy var pageNum: Double = {
        if self.isRemoveAll {
            return 1
        }
        return pageNum
    }()

    lazy var tableView: NoShadowTableView = {
        let markTableView = NoShadowTableView(frame: CGRectMake(0, NAVIGATIONBAR_HEIGHT, SCREEN_WIDTH, SCREEN_HEIGHT - NAVIGATIONBAR_HEIGHT), style: .grouped)
        if #available(iOS 11.0, *) {
            markTableView.contentInsetAdjustmentBehavior = .never
            markTableView.estimatedRowHeight = 0
            markTableView.estimatedSectionFooterHeight = 0
            markTableView.estimatedSectionHeaderHeight = 0
        }
        markTableView.delegate = self
        markTableView.dataSource = self
        markTableView.backgroundColor = .clear
        markTableView.showsVerticalScrollIndicator = false
        markTableView.separatorStyle = .none
        markTableView.addSubview(self.tableHeaderBackgroundView)
        if let cellName = self.strCellName {
            let cellClass = NSClassFromString(cellName) as! UITableViewCell.Type
            markTableView.register(cellClass, forCellReuseIdentifier: cellName)
        }
        return markTableView
    }()

    // 提供一个方法来修改 tableView 样式
    func updateTableViewStyle(to style: UITableView.Style) {
        tableView.removeFromSuperview()
        let newTableView = NoShadowTableView(frame: CGRect(x: 0, y: NAVIGATIONBAR_HEIGHT, width: SCREEN_WIDTH, height: SCREEN_HEIGHT - NAVIGATIONBAR_HEIGHT), style: style)
        // 设置新的 tableView 的属性
        if #available(iOS 11.0, *) {
            newTableView.contentInsetAdjustmentBehavior = .never
            newTableView.estimatedRowHeight = 0
            newTableView.estimatedSectionFooterHeight = 0
            newTableView.estimatedSectionHeaderHeight = 0
        }
        newTableView.delegate = self
        newTableView.dataSource = self
        newTableView.backgroundColor = COLOR_WHITE()
        newTableView.showsVerticalScrollIndicator = false
        newTableView.separatorStyle = .none
        newTableView.addSubview(tableHeaderBackgroundView)
        if let cellName = strCellName {
            let cellClass = NSClassFromString(cellName) as! UITableViewCell.Type
            newTableView.register(cellClass, forCellReuseIdentifier: cellName)
        }
        tableView = newTableView // 用新的 tableView 替换旧的
        view.addSubview(tableView)
    }

    lazy var tableHeaderBackgroundView: UIImageView = {
        let viewBg = UIImageView()
        viewBg.widthHeight = XY(SCREEN_WIDTH, W(400))
        viewBg.leftTop = XY(0, -viewBg.height)
        viewBg.backgroundColor = .clear
        return viewBg
    }()
    
    // 认证挽留
    lazy var viewDetainment: AuthDetainmentView = {
        let result = AuthDetainmentView()
        result.blockConfirmExit = { [weak self] in
            guard let self = self else { return }
            if isPopNextPage {
                GB_Nav?.popViewController(animated: true)
            }else{
                GB_Nav?.popToClass("ProductDetailVC")
            }
        }
        return result
    }()

    // MARK: - viewDidLoad
    init() {
        super.init(nibName: nil, bundle: nil)
        isRemoveAll = true
    }

    @available(*, unavailable)
    required init?(coder _: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        view.addSubview(tableView)
    }

    // MARK: - request
    func requestList() {}

    // MARK: - 添加上拉下拉
    func addRefresh() {
        addRefreshHeader()
        addRefreshFooter()
    }

    func addRefreshHeader() {
        tableView.mj_header = CustomHeader()
        tableView.mj_header?.setRefreshingTarget(self, refreshingAction: #selector(refreshHeaderAll))
        tableView.insertSubview(tableHeaderBackgroundView, at: 0)
    }

    func addRefreshFooter() {
        tableView.mj_footer = CustomFooter()
        tableView.mj_footer?.setRefreshingTarget(self, refreshingAction: #selector(refreshFooterAll))
    }

    // refresh
    @objc func refreshHeaderAll() {
        tableView.mj_footer?.isUserInteractionEnabled = false
        isRemoveAll = true
        requestList()
    }

    @objc func refreshFooterAll() {
        tableView.mj_header?.isUserInteractionEnabled = false
        isRemoveAll = false
        requestList()
    }

    // 结束上拉下拉
    @objc func endRefreshing() {
        tableView.mj_header?.isUserInteractionEnabled = true
        tableView.mj_header?.endRefreshing()
        tableView.mj_footer?.isUserInteractionEnabled = true
        tableView.mj_footer?.endRefreshing()
    }

    // MARK: - 滚动收键盘
    func scrollViewWillBeginDragging(_: UIScrollView) {
        view.endEditing(true)
    }

    // MARK: - tableView delegate
    func tableView(_: UITableView, numberOfRowsInSection _: Int) -> Int {
        return aryDatas.count
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        if isStr(strCellName) {
            let cell = tableView.dequeueReusableCell(withIdentifier: strCellName!, for: indexPath)
            _ = GlobalMethod.performSelector(selectorName: "resetCellWithModel:", delegate: cell, object: aryDatas[indexPath.row], isHasReturn: false)
            return cell
        } else {
            if let cell = self.tableView.dequeueReusableCell(withIdentifier: "UITableViewCell") {
                return cell
            } else {
                let newCell = UITableViewCell(style: .default, reuseIdentifier: "UITableViewCell")
                return newCell
            }
        }
    }

    func tableView(_: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        if isStr(strCellName) {
            if let cellClass = NSClassFromString(strCellName!) as? UIView.Type {
                let height = cellClass.fetchHeight(model: aryDatas[indexPath.row])
                return height
            } else {
                return CGFLOAT_MIN
            }
        } else {
            return CGFLOAT_MIN
        }
    }

    func tableView(_: UITableView, heightForHeaderInSection _: Int) -> CGFloat {
        return CGFLOAT_MIN
    }

    func tableView(_: UITableView, heightForFooterInSection _: Int) -> CGFloat {
        return CGFLOAT_MIN
    }

    func tableView(_: UITableView, viewForHeaderInSection _: Int) -> UIView? {
        return UIView()
    }

    func tableView(_: UITableView, viewForFooterInSection _: Int) -> UIView? {
        return UIView()
    }
}

// 隐藏阴影
class NoShadowTableView: UITableView {
    override func didAddSubview(_ subview: UIView) {
        super.didAddSubview(subview)
        if "\(type(of: subview))" == "UIShadowView" {
            subview.removeFromSuperview()
        }
    }
}
